package com.tp2.dominio;

import java.util.ArrayList;
import java.util.Collection;

import com.tp2.dao.ParserProductos;

public class Caja {

	private String estado;
	private Ticket ticketActual;
	private Collection<Ticket> ticketsFinalizados;
	private Collection<Producto> productos;

	public Caja() {

		estado = "Cerrada";
		ticketActual = null;
		ticketsFinalizados = new ArrayList<Ticket>();
		ParserProductos parser = new ParserProductos("inventarioProductosTest.xml");
		productos = parser.getProductos();
	}

	public void abrir() {

		estado = "Abierta";

	}

	public void cerrar() throws Exception {

		if (!hayCompraActiva()) {
			ticketsFinalizados = new ArrayList<Ticket>();
			estado = "Cerrada";
		} else {
			throw new Exception("No se puede cerrar la caja");
		}

	}

	public String getEstado() {

		if (hayCompraActiva())
			return "Vendiendo";

		return estado;

	}
	
	public Collection<Producto> getProductos() {
		return productos;
	}

	public void setProductos(Collection<Producto> productos) {
		this.productos = productos;
	}


	public void iniciarCompra() throws Exception {

		if (getEstado() == "Abierta" && !hayCompraActiva()) {

			ticketActual = new Ticket();

		} else {
			throw new Exception("No se pudo iniciar la compra");
		}

	}

	public void agregarProducto(Producto producto) throws Exception {

		if (hayCompraActiva()) {

			ticketActual.agregarItem(producto);

		} else {
			throw new Exception("No hay ninguna compra iniciada");
		}

	}

	public Producto agregarProducto(String codigoProducto) throws Exception {

		if (hayCompraActiva()) {

			Producto producto = new Producto(obtenerProducto(codigoProducto));
			
			ticketActual.agregarItem(producto);

			return producto;

		} else {
			throw new Exception("No hay ninguna compra iniciada");
		}

	}

	private Producto obtenerProducto(String codigoProducto) throws Exception {

		for (Producto producto : productos) {

			if (producto.getCodigo().equals(codigoProducto))
				return producto;
		}

		throw new Exception("Producto no encontrado");
	}

	public Ticket getTicket() {

		return ticketActual;
	}

	public double generarTotal() {

		return ticketActual.getTotal();
	}

	public void cancelarCompra() {

		ticketActual = null;

	}

	public void confirmarCompra(MedioDePago medioDePago) throws Exception {

		if (hayCompraActiva()) {
			ticketActual.cerrar(medioDePago);
		} else {
			throw new Exception("No hay ninguna compra iniciada");
		}

	}

	public Ticket getTicketActual() {
		return ticketActual;
	}

	public void terminarCompra() throws Exception {

		if (hayCompraActiva()) {
			if (ticketActual.getEstado().equals("cerrado")) {
				ticketsFinalizados.add(ticketActual);
				ticketActual = null;
			} else {
				throw new Exception("Confirme la compra primero");
			}

		} else {
			throw new Exception("No hay ninguna compra iniciada");
		}

	}

	public double getTotalVentas() {

		double total = 0;

		for (Ticket ticket : ticketsFinalizados) {

			total += ticket.getSubtotal();

		}

		return total;

	}

	public double getTotalDescuentosOrtogados() {

		double total = 0;

		for (Ticket ticket : ticketsFinalizados) {

			total += ticket.getTotalDescuentos();

		}

		return total;

	}

	public double getTotalMedioDePago(MedioDePago medioDePago) {

		double total = 0;

		for (Ticket ticket : ticketsFinalizados) {

			if (ticket.getMedioDePago().getNombre() == medioDePago.getNombre())
				total += ticket.getSubtotal();
		}

		return total;

	}

	public Collection<Ticket> getTicketsFinalizados() {
		return ticketsFinalizados;
	}

	private boolean hayCompraActiva() {

		return ticketActual != null;
	}

}
